local Widget = require "widgets/widget"  -- 基础Widget类
local ImageButton = require "widgets/imagebutton"  -- ImageButton基类

-- CheckBox 类定义，继承自 ImageButton
local CheckBox = Class(ImageButton, function(self,
    atlas, off_tex, off_highlight_tex, off_disabled_tex, down, scale, offset, -- 未选中状态的纹理和属性
    on_tex, on_highlight_tex, on_disabled_tex,clickoffset) -- 选中状态的纹理和点击偏移

    -- (DS 修改) 调用父类 ImageButton 的构造函数 _ctor，只传递 DS 支持的参数
    ImageButton._ctor(self,
        atlas or "images/ui.xml",
        off_tex or "checkbox_off.tex",
        off_highlight_tex or "checkbox_off_highlight.tex",
        off_disabled_tex or "checkbox_off_disabled.tex"
        -- down, -- (DS 不支持)
        -- nil, -- (DS 不支持 selected)
        -- scale or {1,1}, -- (DS 不支持)
        -- offset or {0,0} -- (DS 不支持)
    )
    -- (DS 添加) 单独设置 scale 和 offset
    local final_scale = scale or {1,1}
    local final_offset = offset or {0,0}
    self.image:SetScale(final_scale[1], final_scale[2] or final_scale[1])
    self.image:SetPosition(final_offset[1], final_offset[2])

    -- 保存未选中状态的纹理引用和属性
    self.atlas = atlas or "images/ui.xml" -- 纹理集路径
    self.off_tex = off_tex or "checkbox_off.tex" -- 未选中状态的默认纹理
    self.off_highlight_tex = off_highlight_tex or "checkbox_off_highlight.tex" -- 未选中状态的高亮纹理
    self.off_disabled_tex = off_disabled_tex or "checkbox_off_disabled.tex" -- 未选中状态的禁用纹理
    self.scale = scale or {1,1} -- 缩放比例
    self.offset = offset or {0,0} -- 位置偏移

    -- 保存选中状态的纹理引用
    self.on_tex = on_tex or "checkbox_on.tex" -- 选中状态的默认纹理
    self.on_highlight_tex = on_highlight_tex or "checkbox_on_highlight.tex" -- 选中状态的高亮纹理
    self.on_disabled_tex = on_disabled_tex or "checkbox_on_disabled.tex" -- 选中状态的禁用纹理

    -- 初始化当前选中状态为 false (未选中)
    self.checked = false

    -- 保存点击时的视觉偏移量 --具体实现在ImageButton的OnControl方法
    self.clickoffset = clickoffset or Vector3(0, -3, 0) -- 默认为 Y 轴向下偏移 3 个单位

    -- 设置默认的点击事件处理函数
    self:SetOnClick(function()
        self:SetToggle(not self.checked,true) -- 切换选中状态，并触发回调
        TheFrontEnd:GetSound():PlaySound("dontstarve/HUD/click_move") -- 播放点击音效
    end)
end)


-- 刷新复选框的显示状态
-- (DS 修改) 重写 RefreshState 以适配 DS ImageButton
function CheckBox:RefreshState()
    if not self:IsEnabled() then -- 检查是否禁用 (IsEnabled 会检查层级)
        self:OnDisable() -- 应用禁用状态视觉
    elseif self.focus then -- 检查是否聚焦
        self:OnGainFocus() -- 应用聚焦状态视觉
    else -- 否则为普通状态
        self:OnLoseFocus() -- 应用普通状态视觉
    end
end

-- 1. 添加禁用状态支持
-- 设置复选框的启用/禁用状态
-- @param enabled (boolean) true 表示启用，false 表示禁用
function CheckBox:SetEnabled(enabled)
    self.enabled = enabled -- 更新 enabled 属性
    self:RefreshState() -- 刷新视觉状态以应用更改
end

-- 设置复选框的选中状态
-- @param checked (boolean) true 表示选中，false 表示未选中
-- @param isTriggerCallback (boolean, optional) 是否触发 ontoggle 回调，默认为 false
function CheckBox:SetToggle(checked,isTriggerCallback)
    self.checked = checked -- 更新 checked 属性
    -- 根据新的选中状态更新显示的纹理
    if self.checked then -- 如果是选中状态
        -- (DS 修改) 调用 SetTextures 时只传递 DS 支持的参数
        self:SetTextures(
            self.atlas,
            self.on_tex,
            self.on_highlight_tex,
            self.on_disabled_tex
            -- nil, nil, self.scale, self.offset -- (DS 不支持)
        )
        -- (DS 添加) 单独设置 scale 和 offset
        self.image:SetScale(self.scale[1], self.scale[2] or self.scale[1])
        self.image:SetPosition(self.offset[1], self.offset[2])
    else -- 如果是未选中状态
        -- (DS 修改) 调用 SetTextures 时只传递 DS 支持的参数
        self:SetTextures(
            self.atlas,
            self.off_tex,
            self.off_highlight_tex,
            self.off_disabled_tex
            -- nil, nil, self.scale, self.offset -- (DS 不支持)
        )
        -- (DS 添加) 单独设置 scale 和 offset
        self.image:SetScale(self.scale[1], self.scale[2] or self.scale[1])
        self.image:SetPosition(self.offset[1], self.offset[2])
    end

    -- 如果需要触发回调，并且设置了 ontoggle 回调函数
    if isTriggerCallback and self.ontoggle then
        self.ontoggle(self.checked) -- 调用回调函数，并传入当前的选中状态
    end
end


-- 设置选中状态切换时的回调函数
-- @param fn (function) 当选中状态改变时调用的函数，会接收一个布尔值参数表示新的选中状态
function CheckBox:SetOnToggle(fn)
    self.ontoggle = fn -- 保存回调函数引用
end


-- 检查复选框当前是否处于选中状态
-- @return (boolean) 如果选中则返回 true，否则返回 false
function CheckBox:IsChecked()
    return self.checked -- 返回 checked 属性的值
end

return CheckBox
